home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gigarom 1
/
Gigarom Macintosh Archives (Quantum Leap)(CDRM1080320)(1993).iso
/
FILES
/
DEV
/
I-Z
/
Xlisp_Source.cpt
/
xljump.c
< prev
next >
Wrap
Text File
|
1985-04-08
|
2KB
|
105 lines
/* xljump - execution context routines */
#include "xlisp.h"
/* external variables */
extern CONTEXT *xlcontext;
extern NODE *xlvalue;
extern NODE *xlstack,*xlenv,*xlnewenv;
extern int xltrace,xldebug;
/* xlbegin - beginning of an execution context */
xlbegin(cptr,flags,expr)
CONTEXT *cptr; int flags; NODE *expr;
{
cptr->c_flags = flags;
cptr->c_expr = expr;
cptr->c_xlstack = xlstack;
cptr->c_xlenv = xlenv;
cptr->c_xlnewenv = xlnewenv;
cptr->c_xltrace = xltrace;
cptr->c_xlcontext = xlcontext;
xlcontext = cptr;
}
/* xlend - end of an execution context */
xlend(cptr)
CONTEXT *cptr;
{
xlcontext = cptr->c_xlcontext;
}
/* xljump - jump to a saved execution context */
xljump(cptr,type,val)
CONTEXT *cptr; int type; NODE *val;
{
/* restore the state */
xlcontext = cptr;
xlstack = xlcontext->c_xlstack;
xlunbind(xlcontext->c_xlenv);
xlnewenv = xlcontext->c_xlnewenv;
xltrace = xlcontext->c_xltrace;
xlvalue = val;
/* call the handler */
longjmp(xlcontext->c_jmpbuf,type);
}
/* xlgo - go to a label */
xlgo(label)
NODE *label;
{
CONTEXT *cptr;
NODE *p;
/* find a tagbody context */
for (cptr = xlcontext; cptr; cptr = cptr->c_xlcontext)
if (cptr->c_flags & CF_GO)
for (p = cptr->c_expr; consp(p); p = cdr(p))
if (car(p) == label)
xljump(cptr,CF_GO,p);
xlfail("no target for go");
}
/* xlreturn - return from a block */
xlreturn(val)
NODE *val;
{
CONTEXT *cptr;
/* find a block context */
for (cptr = xlcontext; cptr; cptr = cptr->c_xlcontext)
if (cptr->c_flags & CF_RETURN)
xljump(cptr,CF_RETURN,val);
xlfail("no target for return");
}
/* xlthrow - throw to a catch */
xlthrow(tag,val)
NODE *tag,*val;
{
CONTEXT *cptr;
/* find a catch context */
for (cptr = xlcontext; cptr; cptr = cptr->c_xlcontext)
if ((cptr->c_flags & CF_THROW) && cptr->c_expr == tag)
xljump(cptr,CF_THROW,val);
xlfail("no target for throw");
}
/* xlsignal - signal an error */
xlsignal(emsg,arg)
char *emsg; NODE *arg;
{
CONTEXT *cptr;
/* find an error catcher */
for (cptr = xlcontext; cptr; cptr = cptr->c_xlcontext)
if (cptr->c_flags & CF_ERROR) {
if (cptr->c_expr)
xlerrprint("error",NULL,emsg,arg);
xljump(cptr,CF_ERROR,NIL);
}
xlfail("no target for error");
}